﻿namespace HanoiTower
{
    internal class Program
    {   /// <summary>
        /// 汉诺塔游戏
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            Console.WriteLine("请输入汉诺塔的层数");
            int Towernumber = Convert.ToInt32(Console.ReadLine());
            DateTime StartTime = DateTime.Now;
            MovingOfOneStep(Towernumber, 'A', 'B', 'C');
            DateTime EndTime = DateTime.Now;
            TimeSpan span = EndTime - StartTime;
            string Time = span.TotalSeconds.ToString();
            Console.WriteLine($"所耗时间{Time}");    
            Console.ReadKey();
        }
        //作为递归，我可以把这个函数的功能直接假定为把盘从A盘到C盘
        public static void MovingOfOneStep(int Towernumber, char A, char B, char C)
        {

            //跳出递归的条件
            if (Towernumber == 1)
                Console.WriteLine($"将{Towernumber}号盘从{A}柱移到{C}柱");
            //将盘从A柱到C柱的过程，看成n-1到B上，最下面的盘到C中
            //上面的状态作为一个分界点，之前如何实现，和之后如何实现
            else
            {   //之前的实现，即将A移动到B，所以赋的参数的位置发生改变
                MovingOfOneStep(Towernumber - 1, A, C, B);
                //中间状态
                Console.WriteLine($"将{Towernumber}号盘从{A}柱到{C}柱");
                //之后的实现，是将B移动到C，同理
                MovingOfOneStep(Towernumber - 1, B, A, C);
                //这个结构实在太巧妙了，我是写不出的，其中恰好打印路径，实在厉害
            }
        }
    }
}